package org.ejb.entities;

import javax.persistence.*;

import java.io.Serializable;
import java.util.*;

/**
* Cette classe represente un bon de commande. Un bon de commande est cree pour un client
* et possede plusieurs lignes de commande. Il est lie a une adresse de livraison
* qui peut etre differente de celle du client.
* @see Utilisateur
* @see OrderLine
*/

@SuppressWarnings("serial")
@Entity
public class OrderParFois implements Serializable {

    /**
	 * 
	 */
	
	// ======================================
    // =             Attributs              =
    // ======================================
	@Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    
    @ManyToOne(cascade=CascadeType.REFRESH)
    private Utilisateur utilisateur;
    
	@OneToOne(cascade=CascadeType.ALL)
	private Address deliveryAddress;
   
    // Le prix total de la commande
    private Float totalPrix = 0f;
    
    // orderLine qui garde une historique d'un produit
	@OneToMany(mappedBy="orderParFois", fetch=FetchType.EAGER)
	private List<OrderLine> orderLine = new ArrayList<OrderLine>();
    
    // ======================================
    // =             Constantes             =
    // ======================================

    // ======================================
    // =            Constructeurs           =
    // ======================================
    public OrderParFois() {
    }
    
//  public Order(Utilisateur customer, Address deliveryAddress) {
//	this.utilisateur = customer;
//	this.deliveryAddress = deliveryAddress;
//}

//public Order(Utilisateur customer, Address deliveryAddress, CreditCard creditCard) {
//    this.utilisateur = customer;
//    this.deliveryAddress = deliveryAddress;
//    this.creditCard = creditCard;
//}


    // ======================================
    // =     Methodes Lifecycle Callback    =
    // ======================================
//    @PrePersist
//    private void setDefaultData() {
//        orderDate = new Date();
//    }

    // ======================================
    // =          Methodes publiques        =
    // ======================================
//    public void getTotal() {
//        if (orderLines == null || orderLines.isEmpty())
//            this.total= 0f;
//
//        Float total = 0f;
//
//        // sum up the quantities
//        for (OrderLine orderLine : orderLines) {
//            total += (orderLine.getSubTotal());
//        }
//
//        this.total = total;
//    }
    
    /**
     * Methode pour distinguer les differentes categories pour un bon de commande
     * @param order le bon de commande
     * @return
     */
//	public static Set<Produit> getDistinctCategories(Order order){
//        Set<Produit> catSet = new HashSet<Produit>();
//        for(OrderLine line:order.getOrderLines()){
//          catSet.add(line.getItem().getProduct());
//        }
//        return catSet;
//    }
    

    // ======================================
    // =          Methodes Protegees        =
    // ======================================

    // ======================================
    // =             Accesseurs             =
    // ======================================

    public Long getId() {
        return id;
    }
    public void setId(long id) {
		this.id = id;
	}

    public Address getDeliveryAddress() {
        return deliveryAddress;
    }
    public void setDeliveryAddress(Address deliveryAddress) {
        this.deliveryAddress = deliveryAddress;
    }
    
	public Float getTotal() {
		return totalPrix;
	}
	public void setTotal(Float totalPrix) {
		this.totalPrix = totalPrix;
	}
	
	/** @return order */
	public List<OrderLine> getOrderParFois() {
		return orderLine;
	}
	public void setOrderParFois(List<OrderLine> orderLine) {
		this.orderLine = orderLine;
	}
	
//    public Date getOrderDate() {
//        return orderDate;
//    }
//	public void setOrderDate(Date orderDate) {
//		this.orderDate = orderDate;
//	}

    public Utilisateur getUtilisateur() {
		return utilisateur;
	}
	public void setUtilisateur(Utilisateur utilisateur) {
		this.utilisateur = utilisateur;
		utilisateur.getOrder().add(this);
	}


//    public List<OrderLine> getOrderLines() {
//        return orderLines;
//    }
//    public void setOrderLines(List<OrderLine> orderLines) {
//        this.orderLines = orderLines;
//    }

   
//    public CreditCard getCreditCard() {
//        return creditCard;
//    }
//
//    public void setCreditCard(CreditCard creditCard) {
//        this.creditCard = creditCard;
//    }

//    public String getCreditCardNumber() {
//        return creditCard.getCreditCardNumber();
//    }
//    public void setCreditCardNumber(String creditCardNumber) {
//        creditCard.setCreditCardNumber(creditCardNumber);
//    }

//    public String getCreditCardType() {
//        return creditCard.getCreditCardType();
//    }
//    public void setCreditCardType(String creditCardType) {
//        creditCard.setCreditCardType(creditCardType);
//    }

//    public String getCreditCardExpiryDate() {
//        return creditCard.getCreditCardExpDate();
//    }
//    public void setCreditCardExpiryDate(String creditCardExpiryDate) {
//        creditCard.setCreditCardExpDate(creditCardExpiryDate);
//    }

    // ======================================
    // =           Methodes Privees         =
    // ======================================

    // ======================================
    // =   Methodes hash, equals, toString  =
    // ======================================

    

//	@Override
//    public boolean equals(Object o) {
//        if (this == o) return true;
//        if (o == null || getClass() != o.getClass()) return false;
//
//        Order order = (Order) o;
//
//        if (!oid.equals(order.oid)) return false;
//        if (!orderDate.equals(order.orderDate)) return false;
//
//        return true;
//    }
//
//    @Override
//    public int hashCode() {
//        int result;
//        result = oid.hashCode();
//        result = 31 * result + orderDate.hashCode();
//        return result;
//    }
//
//    @Override
//    public String toString() {
//        final StringBuilder sb = new StringBuilder();
//        sb.append("Order");
//        sb.append("{id=").append(oid);
//        sb.append(", orderDate=").append(orderDate);
//        sb.append(", customer=").append(utilisateur);
//        sb.append(", orderLines=").append(orderLines == null ? 0 : orderLines.size());
//        sb.append(", deliveryAddress=").append(deliveryAddress);
//        sb.append(", creditCard=").append(creditCard);
//        sb.append('}');
//        return sb.toString();
//    }
}
